/************************************
 * 描述：本文件主要用于存放通用的逻辑声明
 * 公司：我们公司
 * 时间：2022-02-22
 ************************************/
#pragma once

#include <user_exits/user_exits.h>
#include <user_exits/epm_toolkit_utils.h>
#include <server_exits/user_server_exits.h>
#include <epm/epm.h>
#include <epm/signoff.h>
#include <bom/bom.h>
#include <bom/bom_msg.h>
#include <tccore/grm_msg.h>
#include <tccore/tc_msg.h>
#include <tccore/custom.h>
#include <tccore/aom.h>
#include <tccore/aom_errors.h>
#include <tccore/aom_prop.h>
#include <tccore/grm_msg.h>
#include <tccore/tc_msg.h>
#include <tccore/tctype.h>
#include <sa/groupmember.h>
#include <sa/user.h>
#include <tc/preferences.h>

#if !defined(SITE)
#error 'SITE' is not defined
#endif

#if !defined(VER)
#define VER 1.0
#endif

#if !defined(ROW_SEPARATOR)
#define ROW_SEPARATOR "******************************************************\n"
#endif

#if !defined(MAX_MESSAGE_SIZE)
#define MAX_MESSAGE_SIZE 2000
#endif

#if !defined(VISIBLE)
#ifdef _WIN32
#define VISIBLE
#else
#define VISIBLE __attribute__ ((visibility("default")))
#endif
#endif

#define BEGIN int ifail = ITK_ok
#define END return (ifail)
#define CHECK(func)	{ if (ITK_ok != (ifail = func)){\
char* err_string = NULL;\
EMH_ask_error_text(ifail, &err_string);\
info_syslog ("*ERROR: %d, ERROR MSG: %s.\n", ifail, err_string);\
info_syslog ("*FUNCTION: %s, FILE: %s, LINE: %d.\n", #func, __FILE__, __LINE__);\
if(NULL != err_string) MEM_free (err_string); }}
#define EX_STRING(text) TO_STRING(text)
#define TO_STRING(text) #text
#define CALLBACKS(site) site##_register_callbacks()

typedef int (*OUR_object_func) (tag_t);

/// <summary>
/// 公司：我们公司
/// 作者：李云
/// 时间：2022-01-23
/// 描述：打印日志信息
/// </summary>
/// <param name="format">格式化字符串</param>
/// <param name="...">日志内容</param>
void info_syslog(const char* format, ...);

/// <summary>
/// 公司：我们公司
/// 作者：李云
/// 时间：2022-01-23
/// 描述：打印欢迎信息
/// </summary>
void show_welcome();

/// <summary>
/// 公司：我们公司
/// 作者：李云
/// 时间：2022-01-23
/// 描述：获取流程中的任务对象
/// </summary>
/// <param name="task">流程</param>
/// <param name="count">对象数量</param>
/// <param name="attachments">任务对象</param>
/// <returns>操作是否成功</returns>
int get_task_attachments(tag_t task, int* count, tag_t** attachments);

/// <summary>
/// 公司：我们公司
/// 作者：李云
/// 时间：2022-01-23
/// 描述：遍历处理任务中的关联对象
/// </summary>
/// <param name="task">流程任务</param>
/// <param name="action">流程功能</param>
/// <param name="func">处理函数</param>
/// <returns>操作是否成功</returns>
int foreach_task_attachments(tag_t task, EPM_action_t action, OUR_object_func func);

/// <summary>
/// 公司：我们公司
/// 作者：李云
/// 时间：2022-01-23
/// 描述：判断对象类型
/// </summary>
/// <param name="object">对象</param>
/// <param name="parent_type_name">类型</param>
/// <returns>是否 parent_type_name 类型的对象</returns>
logical is_type_of(tag_t object, const char* parent_type_name);

/// <summary>
/// 公司：我们公司
/// 作者：李云
/// 时间：2022-01-23
/// 描述：是否包含对象
/// </summary>
/// <param name="objects">所有对象</param>
/// <param name="count">对象数量</param>
/// <param name="object">当前对象</param>
/// <returns>objects 是否包含 object</returns>
logical is_contains(tag_t* objects, int count, tag_t object);
